namespace map2D {
	/**障碍格子类*/
	export class Barrier{		
		public static tempVec:number[] = [];
		/**不通行*/public static NONE:number = 0;
		/**陆路通行*/public static LAND:number = 1;
		/**水路通行*/public static WATER:number = 2;
		/**空路通行*/public static AIR:number = 4;
		/**阴影通行*/public static SHADOW:number = 8;
		/**全通行*/public static PASS:number = 7;
		/**步行通行*/public static STEP_PASS:number=1+2;
		private _barriers:number[];
		private _barrierArray:number[][];
		private _col:number;
		private _row:number;
		private _minX:number;
		private _minY:number;
		private _maxX:number;
		private _maxY:number;
		private _minCol:number;
		private _minRow:number;
		private _gridSize:number;		
		private _barrierMaxCol:number;
		private _barrierMaxRow:number;
		private _mapWidth:number;
		private _mapHeight:number;
		public constructor() {
		}
		/**设置障碍信息
		 * @param barrierArray 障碍配置数组
		 * @param mapSize 地图尺寸 [最小x,最小y,最大x,最大y,障碍列数，障碍行数，地图图片实际宽度，地图图片实际高度]
		 * @param gridSize 格子宽度
		*/
		public setBarrier(barrierArray:number[],mapSize:number[],gridSize:number):void
		{
			let s = this;
			s._barriers = barrierArray;			
			s._minX = mapSize[0];
			s._minY = mapSize[1];
			s._maxX = mapSize[2];
			s._maxY = mapSize[3];
			s._col = mapSize[4];
			s._row = mapSize[5];
			s._mapWidth = mapSize[6];
			s._mapHeight = mapSize[7];
			s._minCol = Math.floor(s._minX / s._gridSize) % s._col;
			s._minRow = Math.floor(s._minY / s._gridSize) % s._row;			
			s._gridSize = gridSize;
			s._barrierMaxCol = Math.floor(s._mapWidth / s._gridSize);
			s._barrierMaxRow = Math.floor(s._mapHeight / s._gridSize);
			s._barrierArray = [];
			// let i:number,j:number,len:number,len2:number;
			// len = s._barrierMaxRow;
			// len2 = s._barrierMaxCol;
			// for(i=0;i<len;++i)
			// {
			// 	if(s._barrierArray[i] == null)
			// 		s._barrierArray[i] = [];
			// 	for(j=0;j<len2;++j)
			// 	{
			// 		s._barrierArray[i][j] = s.getBarrierValue(j,i);
			// 	}
			// }
		}
		/**判断障碍状态
		 * @param x 世界坐标x
		 * @param y 世界坐标y
		 * @param flag 通行标志 参考Barrier常量 1 陆 2 水 4 空
		 * @return 返回障碍状态 头3位存在大于0则为通行，第4位代表是否有阴影
		*/
		public barrierState(x:number,y:number,flag:number = 1):number
		{
			let s = this;
			if(x < s._minX || x > s._maxX || y < s._minY || y > s._maxY)
				return Barrier.NONE;
			let col:number,row:number;			
			col = Math.floor(x / s._gridSize) % s._col;
			row = Math.floor(y / s._gridSize) % s._row;
			return s.barrierGridState(col,row,flag);
		}		

		/**判断障碍状态(根据格子索引)
		 * @param col 格子列索引
		 * @param row 格子行索引
		 * @param flag 通行标志 参考Barrier常量 1 陆 2 水 4 空
		 * @return 返回障碍状态 头3位存在大于0则为通行，第4位代表是否有阴影
		*/
		public barrierGridState(col:number,row:number,flag:number = 1):number
		{
			let s = this;
			let value:number;						
			if(s._barrierArray[row] != null && s._barrierArray[row][col] != null)
				value = s._barrierArray[row][col];
			else
			{
				if(s._barrierArray[row] == null)
					s._barrierArray[row] = [];
				value = s._barrierArray[row][col] = s.getBarrierValue(col, row);			
			}
			if(value == null)return Barrier.PASS & flag;
			return value & flag;
		}
		/**设置障碍状态(根据格子索引)
		 * @param col 格子列索引
		 * @param row 格子行索引
		 * @param flag 通行标志 参考Barrier常量 0不通行 1 陆 2 水 4 空 -1清空当前格子障碍数据
		*/
		public setBarrierValue(col:number,row:number, flag:number):void
		{
			let s = this;
			if(flag == -1)
			{
				if(s._barrierArray[row] == null)return;
				s._barrierArray[row][col] = null;
				return;
			}
			if(s._barrierArray[row] == null)
				s._barrierArray[row] = [];
			s._barrierArray[row][col] = flag;
		}
		/**获取动态设置的障碍配置，返回-1表示未被设置过*/
		public getBarrierDataValue(col:number, row:number):number
		{
			let s= this;
			if(s._barrierArray[row] == null || s._barrierArray[row][col] == null)
				return -1;
			return s._barrierArray[row][col];
		}
		/**获取地图静态障碍配置*/
		public getBarrierValue(col:number,row:number):number
		{
			let s= this;			
			if(col < 0)col += s._col;
			if(row < 0)row += s._row;
			if(col < s._minCol || row < s._minRow || col > s._col || row > s._row)return 0;						
			return s._barriers[col + row * s._col];
		}	
		/**获取当前格子障碍标志(先读动态，没有则读静态)*/
		public getValue(col:number,row:number):number
		{
			let s = this;
			let value:number;
			value = s.getBarrierDataValue(col, row);
			if(value == -1)
				value = s.getBarrierValue(col, row);
			return value;
		}	
		public outputJson():any
		{
			let i:number,j:number,len:number,len2:number,ind:number;
			let s= this;
			len = s._row;
			len2 = s._col;
			for(i=0;i<len;++i)
			{
				for(j=0;j<len2;++j)
				{
					ind = j + i *s._col; 
					s._barriers[ind] = (s._barriers[ind] === null || s._barriers[ind]===undefined)?Barrier.LAND:s._barriers[ind];
				}
				
			}
			return s._barriers;
		}
	}
}